home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / mathstud.zip / MAGIC.M < prev    next >
Text File  |  1994-01-23  |  1KB  |  60 lines

  1. function y=magic(n)
  2. % y=magic(n)
  3. % generate a magic square for odd n
  4.  
  5. %       S.Halevy 7/31/92
  6. %       Copyright (c) 1992 by the MathWizards
  7.  
  8. y=[];
  9.  
  10. % handle all simple cases
  11. if n==1
  12.   y=1;
  13. elseif n==2
  14.   y=[1 3;4 2];
  15. elseif n==4
  16.   y=[16 2 3 13;5 11 10 8;9 7 6 12;4 14 15 1];
  17. elseif n==6   % needed for one of the demos
  18.   A=magic(3); % recursive call
  19.   y=[A A+18;A+27 A+9];
  20.   t1=y(1,1); y(1,1)=y(4,1); y(4,1)=t1;
  21.   t1=y(3,1); y(3,1)=y(6,1); y(6,1)=t1;
  22.   t1=y(2,2); y(2,2)=y(5,2); y(5,2)=t1;
  23. end
  24.  
  25. if ~isempty(y)
  26.   return;
  27. end
  28.  
  29. if rem(n,2)==0
  30.    n
  31.    error('MathViews does not support magic of that even number')
  32. end
  33.  
  34. y=zeros(n);
  35. n2=n*n;
  36. i0=1;
  37. j0=(n+1)/2;
  38.  
  39. for k=1:n2
  40.   y(i0,j0)=k;
  41.   if k<n2
  42.      i1=rem(n+i0-2,n)+1;
  43.      j1=rem(j0,n)+1;
  44.      if y(i1,j1)>0
  45.           i0=rem(i0,n)+1;
  46.           % no change in j0
  47.      else
  48.           i0=i1;
  49.           j0=j1;
  50.      end
  51.      while y(i0,j0)>0
  52.         i0=rem(i0,n)+1;
  53.         if y(i0,j0)>0
  54.            i0=rem(n+i0-2,n)+1;
  55.            j0=rem(j0,n)+1;
  56.         end
  57.      end
  58.   end
  59. end
  60.